package com.shihan._01_multi_thread_basic.callable;

import java.util.Map;
import java.util.concurrent.*;

/**
 * @Description 用于测试 Callable 线程的 main方法类（使用线程池的方式）
 * @Author shihan
 * @Date 2021/8/8 17:09
 * @Version 1.0
 */
public class MyCallableMain02 {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        System.out.println("main方法开始执行...");
        // 实例化 Callable 对象
        MyCallableThread myCallableThread = new MyCallableThread();

        // 创建线程池（可以返回线程执行过程中 抛出的异常）
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
                5,
                5,
                1,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue<>(10)
        ) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
            }
        };

        // 线程池的 submit 方法，将从线程池中获取线程执行 call 方法
        // 并封装线程的执行结果：一个实现了 Future 接口的对象
        Future<Map<String, Object>> future = executor.submit(myCallableThread);

        // 此处将会阻塞等待，直到 call 方法返回了结果
        Map<String, Object> map = future.get();
        System.out.println(map);
        System.out.println("main方法执行结束...");
        // 关闭线程池资源（生产环境 不需要关闭线程池资源）
        executor.shutdown();
    }

}
